package br.com.consultsystems.interfaces.service.financeiro;

import java.util.List;

import javax.inject.Inject;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.jboss.resteasy.logging.Logger;

import br.com.consultsystems.dominio.financeiro.Historico;
import br.com.consultsystems.dominio.tipos.TipoHistorico;
import br.com.consultsystems.interfaces.AbstractService;
import br.com.consultsystems.interfaces.Resposta;
import br.com.consultsystems.negocio.spec.financeiro.HistoricoNegocio;

@Path("service/historico")
public class HistoricoService extends AbstractService {
	
	private static final Logger LOG = Logger.getLogger(HistoricoService.class);
	
	@Inject
	HistoricoNegocio historicoNegocio;

	@POST
	@Path("/retrieve/filter")
	@Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
	public String retrieveByFilter(String descricao) {
		
		Resposta resposta = new Resposta();
		List<Historico> historicos;

		try {
			historicos = historicoNegocio.retrieveByFilter(descricao);
			resposta.setStatus(true);
			resposta.setMessage(historicos.size() + " registros encontrados.");
			resposta.setObject(historicos);
		} catch (Exception e) {
			LOG.error("Problemas de comunicação: ", e);
			resposta.setStatus(false);
			resposta.setMessage(e.getMessage());
			resposta.setObject(null);
		}
		
		return getGSon().toJson(resposta);
	}

	@POST
	@Path("/retrieve/filter/balancete")
	@Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
	public String retrieveHistoricosBalancete(String descricao) {
		
		Resposta resposta = new Resposta();
		List<Historico> historicos;

		try {
			historicos = historicoNegocio.retrieveByFilter(descricao, TipoHistorico.BALANCETE);
			resposta.setStatus(true);
			resposta.setMessage(historicos.size() + " registros encontrados.");
			resposta.setObject(historicos);
		} catch (Exception e) {
			LOG.error("Problemas de comunicação: ", e);
			resposta.setStatus(false);
			resposta.setMessage(e.getMessage());
			resposta.setObject(null);
		}
		
		return getGSon().toJson(resposta);
	}

	@POST
	@Path("/retrieve/filter/caixabanco")
	@Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
	public String retrieveHistoricosCaixaBanco(String descricao) {
		
		Resposta resposta = new Resposta();
		List<Historico> historicos;

		try {
			historicos = historicoNegocio.retrieveByFilter(descricao, TipoHistorico.CAIXABANCO);
			resposta.setStatus(true);
			resposta.setMessage(historicos.size() + " registros encontrados.");
			resposta.setObject(historicos);
		} catch (Exception e) {
			LOG.error("Problemas de comunicação: ", e);
			resposta.setStatus(false);
			resposta.setMessage(e.getMessage());
			resposta.setObject(null);
		}
		
		return getGSon().toJson(resposta);
	}
	
	@POST
	@Path("/save")
	 @Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
	public String save(String json) {
		
		Resposta resposta = new Resposta();

		try {
			Historico historico = getGSon().fromJson(json, Historico.class);

			historico = historicoNegocio.merge(historico);
			resposta.setStatus(true);
			resposta.setMessage("Histórico Salvo com sucesso!!");
			resposta.setObject(historico);
		} catch (Exception e) {
			LOG.error("Problemas de comunicação: ", e);
			resposta.setStatus(false);
			resposta.setMessage(e.getMessage());
			resposta.setObject(null);
		}
		
		return getGSon().toJson(resposta);
	}

	@POST
	@Path("/remove")
	 @Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
	public String remove(String json) {
		
		Resposta resposta = new Resposta();

		try {
			Historico historico = getGSon().fromJson(json, Historico.class);

			historicoNegocio.remove(historico);
			resposta.setStatus(true);
			resposta.setMessage("Histórico excluido com sucesso!!");
			resposta.setObject(historico);
		} catch (Exception e) {
			LOG.error("Problemas de comunicação: ", e);
			resposta.setStatus(false);
			resposta.setMessage(e.getMessage());
			resposta.setObject(null);
		}
		
		return getGSon().toJson(resposta);
	}
	
}
